]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
userMenu: Indicate progress on status changes
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 14 Sep 2011 13:06:48 +0000 (15:06 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 1 Jun 2012 23:53:44 +0000 (19:53 -0400)
Depending on the number of accounts, the type or simply the network,
there may be a noticable lag between setting the status and the actual
status change.
Use the new user-status-pending icon to indicate progress.

https://bugzilla.gnome.org/show_bug.cgi?id=659067

js/ui/userMenu.js

index bc21fdf22eb4e8dd9c6455a48ca4e17e1ab77321..68ac21f059a76d28de9e60f0cafc8c74042549a8 100644 (file)
@@ -474,13 +474,22 @@ const UserMenuButton = new Lang.Class({
                                        style_class: 'popup-menu-icon' });
         this._idleIcon = new St.Icon({ icon_name: 'user-idle',
                                        style_class: 'popup-menu-icon' });
+        this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending',
+                                          style_class: 'popup-menu-icon' });
 
         this._accountMgr.connect('most-available-presence-changed',
                                   Lang.bind(this, this._updatePresenceIcon));
+        this._accountMgr.connect('account-enabled',
+                                  Lang.bind(this, this._onAccountEnabled));
+        this._accountMgr.connect('account-disabled',
+                                 Lang.bind(this, this._onAccountDisabled));
+        this._accountMgr.connect('account-removed',
+                                  Lang.bind(this, this._onAccountDisabled));
         this._accountMgr.prepare_async(null, Lang.bind(this,
             function(mgr) {
                 let [presence, s, msg] = mgr.get_most_available_presence();
                 this._updatePresenceIcon(mgr, presence, s, msg);
+                this._setupAccounts();
             }));
 
         this._name = new St.Label();
@@ -620,6 +629,46 @@ const UserMenuButton = new Lang.Class({
             this._iconBox.child = this._offlineIcon;
     },
 
+    _setupAccounts: function() {
+        let accounts = this._accountMgr.get_valid_accounts();
+        for (let i = 0; i < accounts.length; i++) {
+            accounts[i]._changingId = accounts[i].connect('notify::connection-status',
+                                                          Lang.bind(this, this._updateChangingPresence));
+        }
+        this._updateChangingPresence();
+    },
+
+    _onAccountEnabled: function(accountMgr, account) {
+        if (!account._changingId)
+            account._changingId = account.connect('notify::connection-status',
+                                                  Lang.bind(this, this._updateChangingPresence));
+        this._updateChangingPresence();
+    },
+
+    _onAccountDisabled: function(accountMgr, account) {
+        account.disconnect(account._changingId);
+        account._changingId = 0;
+        this._updateChangingPresence();
+    },
+
+    _updateChangingPresence: function() {
+        let accounts = this._accountMgr.get_valid_accounts();
+        let changing = false;
+        for (let i = 0; i < accounts.length; i++) {
+            if (accounts[i].connection_status == Tp.ConnectionStatus.CONNECTING) {
+                changing = true;
+                break;
+            }
+        }
+
+        if (changing) {
+            this._iconBox.child = this._pendingIcon;
+        } else {
+            let [presence, s, msg] = this._accountMgr.get_most_available_presence();
+            this._updatePresenceIcon(this._accountMgr, presence, s, msg);
+        }
+    },
+
     _createSubMenu: function() {
         let item;